from PIL import Image, ImageDraw, ImageFont
import random
import string


def generate_captcha():
    # 验证码的宽度和高度
    width, height = 120, 40
    # 创建一个空白图像
    image = Image.new('RGB', (width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)

    # 生成随机验证码
    captcha_text = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))

    # 设置字体
    try:
        # 你可以使用系统中的字体，或者下载一个字体文件
        font = ImageFont.truetype("arial.ttf", 30)
    except IOError:
        font = ImageFont.load_default()

    # 计算文本位置（修复部分）
    bbox = font.getbbox(captcha_text)  # 获取文本边界框
    text_width = bbox[2] - bbox[0]  # 宽度 = 右边界 - 左边界
    text_height = bbox[3] - bbox[1]  # 高度 = 下边界 - 上边界
    text_x = (width - text_width) / 2
    text_y = (height - text_height) / 2

    # 在图像上绘制文本
    draw.text((text_x, text_y), captcha_text, font=font, fill=(0, 0, 0))

    # 添加一些干扰线
    for _ in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)

    return image, captcha_text


# 示例使用
if __name__ == "__main__":
    captcha_image, captcha_code = generate_captcha()
    captcha_image.show()
    print("验证码:", captcha_code)
